在上一篇文章介紹了跳脫正規執行流程的延遲執行 defer
,本篇開始要介紹另外一個執行序 thread
的概念以及如何在 go 內跑多執行序。
本文同步放置於此
執行序就是一個正規執行流程的方式,多執行序就是多個流程平行在執行,接下來要介紹 go 的多執行序要如何撰寫
下面例子是 Go Tour 關於多執行序的例子,請大家先看看下列例子
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
go 的多執行序的寫法就是在執行的方法前加上 go
的關鍵字,在執行後會看到下列結果
hello
world
hello
world
hello
world
world
hello
hello
有些讀者會有疑問,為什麼我跑出來的結果跟上面的結果不一致呢,因為這跟多執行序運行方式有關,所以接下為大家說明。
與 defer
不同的是,多執行序是平行運作的,以上面的例子來講就是 go
這關鍵字的 say 方法與沒有 go
這關鍵字的 say 方法同時被執行,這時就像賽跑一樣有的人跑得快,有的人跑得慢,所以跑得快的就先被執行,跑得慢的後被執行,如此就表現出有時world先被執行的狀況而不是hello跟world交替出現。
多執行序可以拿分工合作當作例子來說明,簡單講就是多個人同時做事,當然同時做事會遇到如果要搶一樣東西時這時候多個人做一定會遇到問題,這也是多執行序常會遇到的race condition問題,當然 go 也會針對這做處理,待後續在跟大家介紹。